home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************/
- /* */
- /* TurboCAD for Windows */
- /* Copyright (c) 1993 - 2001 */
- /* International Microcomputer Software, Inc. */
- /* (IMSI) */
- /* All rights reserved. */
- /* */
- /******************************************************************/
-
- // PropDialog.cpp : implementation file
- //
-
- #include "stdafx.h"
- #include "LTSample.h"
- #include "PropDialog.h"
- #include "PropModify.h"
- #include "AddProperty.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- CString VariantToText(VARIANT *pvarVal, UINT IDS_ARRAY)
- {
- CString cstrText;
- if (pvarVal != NULL)
- {
-
- switch (pvarVal->vt)
- {
- case VT_EMPTY:
- cstrText = "Empty";
- break;
- case VT_I2:
- cstrText.Format("%#X", pvarVal->iVal);
- break;
- case VT_I4:
- cstrText.Format("%#X", pvarVal->lVal);
- break;
- case VT_R4:
- cstrText.Format("%f", pvarVal->fltVal);
- break;
- case VT_R8:
- cstrText.Format("%f", pvarVal->dblVal);
- break;
- case VT_CY:
- {
- COleCurrency currency((const VARIANT&)pvarVal);
- cstrText = currency.Format();
- }
- break;
- case VT_DATE:
- {
- COleDateTime time((const VARIANT&)pvarVal);
- cstrText = time.Format();
- }
- break;
- case VT_BSTR:
- cstrText = pvarVal->bstrVal;
- break;
- case VT_BOOL:
- cstrText = pvarVal->bVal ? "TRUE" : "FALSE";
- break;
- case VT_ARRAY | VT_I2:
- case VT_ARRAY | VT_I4:
- case VT_ARRAY | VT_R4:
- case VT_ARRAY | VT_R8:
- case VT_ARRAY | VT_CY:
- case VT_ARRAY | VT_DATE:
- case VT_ARRAY | VT_BSTR:
- case VT_ARRAY | VT_BOOL:
- cstrText.LoadString(IDS_ARRAY);
- break;
- default:
- cstrText = "Unknown type";
- }
- }
- return cstrText;
- }
-
- void TextToVariant(CString& cstrText, VARIANT *pvarVal, VARTYPE vt)
- {
- if (pvarVal != NULL)
- {
- ::VariantInit(pvarVal);
- switch (vt)
- {
- case VT_I2:
- pvarVal->vt = vt;
- pvarVal->iVal = atoi(cstrText);
- break;
- case VT_I4:
- pvarVal->vt = vt;
- pvarVal->lVal = atol(cstrText);
- break;
- case VT_R4:
- pvarVal->vt = vt;
- pvarVal->fltVal = (float)atof(cstrText);
- break;
- case VT_R8:
- pvarVal->vt = vt;
- pvarVal->dblVal = atof(cstrText);
- break;
- case VT_CY:
- {
- COleCurrency currency;
- if (currency.ParseCurrency(cstrText))
- {
- pvarVal->vt = vt;
- pvarVal->cyVal = currency;
- }
- }
- break;
- case VT_DATE:
- {
- COleDateTime time;
- if (time.ParseDateTime(cstrText))
- {
- pvarVal->vt = vt;
- pvarVal->date = time;
- }
- }
- break;
- case VT_BSTR:
- pvarVal->vt = vt;
- pvarVal->bstrVal = cstrText.AllocSysString();
- break;
- case VT_BOOL:
- if (cstrText.CompareNoCase("True"))
- {
- pvarVal->vt = vt;
- pvarVal->bVal = TRUE;
- }
- else if (cstrText.CompareNoCase("False"))
- {
- pvarVal->vt = vt;
- pvarVal->bVal = FALSE;
- }
- break;
- }
- }
- }
-
- CString VartypeToText(SHORT vt)
- {
- CString cstrText;
- SHORT vtL = vt & 0x0FFF;
- SHORT vtH = vt & 0xF000;
-
- switch (vtH)
- {
- case VT_RESERVED:
- cstrText = "VT_RESERVED";
- break;
- case VT_BYREF:
- cstrText = "VT_BYREF";
- break;
- case VT_ARRAY:
- cstrText = "VT_ARRAY";
- break;
- }
-
- if (!cstrText.IsEmpty())
- cstrText += " | ";
-
- switch (vtL)
- {
- case VT_EMPTY:
- cstrText += "VT_EMPTY";
- break;
- case VT_NULL:
- cstrText += "VT_NULL";
- break;
- case VT_I2:
- cstrText += "VT_I2";
- break;
- case VT_I4:
- cstrText += "VT_I4";
- break;
- case VT_R4:
- cstrText += "VT_R4";
- break;
- case VT_R8:
- cstrText += "VT_R8";
- break;
- case VT_CY:
- cstrText += "VT_CY";
- break;
- case VT_DATE:
- cstrText += "VT_DATE";
- break;
- case VT_BSTR:
- cstrText += "VT_BSTR";
- break;
- case VT_DISPATCH:
- cstrText += "VT_DISPATCH";
- break;
- case VT_ERROR:
- cstrText += "VT_ERROR";
- break;
- case VT_BOOL:
- cstrText += "VT_BOOL";
- break;
- case VT_VARIANT:
- cstrText += "VT_VARIANT";
- break;
- case VT_UNKNOWN:
- cstrText += "VT_UNKNOWN";
- break;
- case VT_UI1:
- cstrText += "VT_UI1";
- break;
- }
- return cstrText;
- }
-
- VARTYPE TextToVartype(CString& cstrText)
- {
- VARTYPE vt = VT_EMPTY;
-
- if (cstrText.Find("VT_RESERVED") >= 0)
- vt |= VT_RESERVED;
-
- if (cstrText.Find("VT_BYREF") >= 0)
- vt |= VT_BYREF;
-
- if (cstrText.Find("VT_ARRAY") >= 0)
- vt |= VT_ARRAY;
-
- if (cstrText.Find("VT_EMPTY") >= 0)
- vt |= VT_EMPTY;
-
- if (cstrText.Find("VT_NULL") >= 0)
- vt |= VT_NULL;
-
- if (cstrText.Find("VT_I2") >= 0)
- vt |= VT_I2;
-
- if (cstrText.Find("VT_I4") >= 0)
- vt |= VT_I4;
-
- if (cstrText.Find("VT_R4") >= 0)
- vt |= VT_R4;
-
- if (cstrText.Find("VT_R8") >= 0)
- vt |= VT_R8;
-
- if (cstrText.Find("VT_CY") >= 0)
- vt |= VT_CY;
-
- if (cstrText.Find("VT_DATE") >= 0)
- vt |= VT_DATE;
-
- if (cstrText.Find("VT_BSTR") >= 0)
- vt |= VT_BSTR;
-
- if (cstrText.Find("VT_DISPATCH") >= 0)
- vt |= VT_DISPATCH;
-
- if (cstrText.Find("VT_ERROR") >= 0)
- vt |= VT_ERROR;
-
- if (cstrText.Find("VT_BOOL") >= 0)
- vt |= VT_BOOL;
-
- if (cstrText.Find("VT_VARIANT") >= 0)
- vt |= VT_VARIANT;
-
- if (cstrText.Find("VT_UNKNOWN") >= 0)
- vt |= VT_UNKNOWN;
-
- if (cstrText.Find("VT_UI1") >= 0)
- vt |= VT_UI1;
-
- return vt;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CPropDialog dialog
-
-
- CPropDialog::CPropDialog(Properties *pProps, CWnd* pParent /*=NULL*/)
- : CDialog(CPropDialog::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CPropDialog)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- m_pProps = pProps;
- }
-
-
- void CPropDialog::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CPropDialog)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
-
-
- BEGIN_MESSAGE_MAP(CPropDialog, CDialog)
- //{{AFX_MSG_MAP(CPropDialog)
- ON_BN_CLICKED(IDC_MODIFY, OnModify)
- ON_BN_CLICKED(IDC_NEW, OnAdd)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CPropDialog message handlers
- #define W_COLUMN 20
-
- #define IND_SUBITEMINDEX 0
- #define IND_SUBITEMID 1
- #define IND_SUBITEMNAME 2
- #define IND_SUBITEMREADONLY 3
- #define IND_SUBITEMTYPE 4
- #define IND_SUBITEMVALUE 5
-
- #define IND_COLUMNINDEX 0
- #define IND_COLUMNID 1
- #define IND_COLUMNAME 2
- #define IND_COLUMNREADONLY 3
- #define IND_COLUMNTYPE 4
- #define IND_COLUMNVALUE 5
-
-
- BOOL CPropDialog::OnInitDialog()
- {
- CDialog::OnInitDialog();
-
- CListCtrl *pPropsList = (CListCtrl *)GetDlgItem(IDC_PROPERTYLIST);
-
- if (pPropsList != NULL)
- {
- LV_COLUMN lvcolumn;
- lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
- lvcolumn.fmt = LVCFMT_LEFT;
-
- CString sResString;
- sResString.LoadString(IDS_PROPERTY_INDEX);
- lvcolumn.pszText = (LPTSTR)(LPCTSTR)sResString;
-
- lvcolumn.iSubItem = IND_SUBITEMINDEX;
- lvcolumn.cx = W_COLUMN * 4;
- pPropsList->InsertColumn(IND_COLUMNINDEX, &lvcolumn); // assumes return value is OK.
-
- sResString.LoadString(IDS_PROPERTY_ID);
- lvcolumn.pszText = (LPTSTR)(LPCTSTR)sResString;
- lvcolumn.iSubItem = IND_SUBITEMID;
- lvcolumn.cx = W_COLUMN * 3;
- pPropsList->InsertColumn(IND_COLUMNID, &lvcolumn); // assumes return value is OK.
-
- sResString.LoadString(IDS_PROPERTY_NAME);
- lvcolumn.pszText = (LPTSTR)(LPCTSTR)sResString;
- lvcolumn.cx = W_COLUMN * 5;
- lvcolumn.iSubItem = IND_SUBITEMNAME;
- pPropsList->InsertColumn(IND_COLUMNAME, &lvcolumn); // assumes return value is OK.
-
- sResString.LoadString(IDS_PROPERTY_READONLY);
- lvcolumn.pszText = (LPTSTR)(LPCTSTR)sResString;
- lvcolumn.cx = W_COLUMN * 4;
- lvcolumn.iSubItem = IND_SUBITEMREADONLY;
- pPropsList->InsertColumn(IND_COLUMNREADONLY, &lvcolumn); // assumes return value is OK.
-
- sResString.LoadString(IDS_PROPERTY_TYPE);
- lvcolumn.pszText = (LPTSTR)(LPCTSTR)sResString;
- lvcolumn.cx = W_COLUMN * 4;
- lvcolumn.iSubItem = IND_SUBITEMTYPE;
- pPropsList->InsertColumn(IND_COLUMNTYPE, &lvcolumn); // assumes return value is OK.
-
- sResString.LoadString(IDS_PROPERTY_VALUE);
- lvcolumn.pszText = (LPTSTR)(LPCTSTR)sResString;
- lvcolumn.cx = W_COLUMN * 4;
- lvcolumn.iSubItem = IND_SUBITEMVALUE;
- pPropsList->InsertColumn(IND_COLUMNVALUE, &lvcolumn); // assumes return value is OK.
- }
-
-
- if (m_pProps != NULL)
- {
-
- long lCount = 0;
- HRESULT hRes = m_pProps->get_Count(&lCount);
- if (SUCCEEDED(hRes))
- {
-
- Property *pProp = NULL;
- CString cstrText;
- BSTR bstrVal = NULL;
- long lVal = 0;
- long lID = 0;
- BOOL bVal = FALSE;
- COleVariant *pvarVal;
- SHORT iVal = 0;
-
-
- VARIANT varIndex;
- ::VariantInit(&varIndex);
- varIndex.vt = VT_I4;
-
- LV_ITEM lvitem;
- int index = 0;
-
- for (long iItem = 0; iItem < lCount; iItem++)
- {
-
- varIndex.lVal = iItem;
- hRes = m_pProps->get_Item(&varIndex, &pProp);
- if (SUCCEEDED(hRes))
- {
- ASSERT(pProp != NULL);
-
- lvitem.mask = LVIF_TEXT;
- lvitem.iItem = index;
-
- hRes = pProp->get_ID(&lID);
- if (SUCCEEDED(hRes))
- {
- lvitem.iSubItem = IND_SUBITEMINDEX;
- hRes = pProp->get_Index(&lVal);
- if (SUCCEEDED(hRes))
- cstrText.Format("%d", lVal);
- else
- cstrText = "?";
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- index = pPropsList->InsertItem(&lvitem);
- ASSERT(index >= 0);
-
- lvitem.iSubItem = IND_SUBITEMID;
- cstrText.Format("%d", lID);
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- hRes = pProp->get_Name(&bstrVal);
- ASSERT(SUCCEEDED(hRes));
- lvitem.iSubItem = IND_SUBITEMNAME;
- cstrText = bstrVal;
- ::SysFreeString(bstrVal);
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- hRes = pProp->get_ReadOnly(&iVal);
- lvitem.iSubItem = IND_SUBITEMREADONLY;
- lvitem.pszText = bVal ? "r-" : "rw";
- VERIFY(pPropsList->SetItem(&lvitem));
-
- hRes = pProp->get_Type(&iVal);
- lvitem.iSubItem = IND_SUBITEMTYPE;
- cstrText = VartypeToText(iVal);
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- pvarVal = new COleVariant();
- hRes = pProp->get_Value(0, pvarVal);
- lvitem.iSubItem = IND_SUBITEMVALUE;
- cstrText = VariantToText(pvarVal, IDS_SOURCE);
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- VERIFY(index == m_arrVal.Add(pvarVal));
- VERIFY(pPropsList->SetItemData(index, (DWORD)pProp));
- index++;
- }
- else
- pProp->Release();
- }
- }
- }
- }
-
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
-
- void CPropDialog::OnModify()
- {
- CListCtrl *pPropsList = (CListCtrl *)GetDlgItem(IDC_PROPERTYLIST);
- if (pPropsList != NULL)
- {
- int iSelItem = pPropsList->GetNextItem(-1, LVNI_SELECTED);
- if (iSelItem >= 0)
- {
- COleVariant *pvarVal = (COleVariant *)m_arrVal.GetAt(iSelItem);
- if (pvarVal != NULL)
- {
- CString cstrName = pPropsList->GetItemText(iSelItem, IND_SUBITEMNAME);
- CString cstrType = pPropsList->GetItemText(iSelItem, IND_SUBITEMTYPE);
-
- CPropModify dlgModify(pvarVal, cstrName, cstrType, this);
- if (dlgModify.DoModal() == IDOK)
- {
- CString cstrText = VariantToText(&(dlgModify.m_varVal), IDS_MODIFIED);
- VERIFY(SUCCEEDED(::VariantCopyInd(pvarVal, dlgModify.m_varVal)));
- LV_ITEM lvitem;
- lvitem.mask = LVIF_TEXT;
- lvitem.iItem = iSelItem;
- lvitem.iSubItem = IND_SUBITEMVALUE;
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
-
- VERIFY(pPropsList->SetItem(&lvitem));
- pPropsList->Update(iSelItem);
- }
- }
- }
-
- }
- }
-
- void CPropDialog::OnCancel()
- {
- // TODO: Add extra cleanup here
-
- CDialog::OnCancel();
- }
-
- void CPropDialog::OnOK()
- {
- CListCtrl *pPropsList = (CListCtrl *)GetDlgItem(IDC_PROPERTYLIST);
- if (pPropsList != NULL)
- {
- ASSERT(::IsWindow(pPropsList->GetSafeHwnd()));
- Property *pProp = NULL;
- int iCount = pPropsList->GetItemCount();
- for (int iItem = 0; iItem < iCount; iItem++)
- {
- COleVariant *pvar = (COleVariant *)m_arrVal.GetAt(iItem);
- pProp = (Property *)pPropsList->GetItemData(iItem);
- if (pProp == NULL)
- {
- CString cstrName = pPropsList->GetItemText(iItem, IND_SUBITEMNAME);
- BSTR bstrName = cstrName.AllocSysString();
-
- COleVariant varReadOnly;
- CString cstrReadOnly = pPropsList->GetItemText(iItem, IND_SUBITEMREADONLY);
- TextToVariant(cstrReadOnly, &varReadOnly, VT_BOOL);
-
- COleVariant varMissing;
- varMissing.vt = VT_ERROR;
- varMissing.scode = DISP_E_PARAMNOTFOUND;
-
- HRESULT hRes = m_pProps->Add(bstrName,
- pvar,
- varReadOnly,
- &varMissing,
- &pProp);
- ::SysFreeString(bstrName);
- if (SUCCEEDED(hRes))
- pProp->Release();
- else
- {
- CString cstrError;
- cstrError.Format(IDS_CANNOTADDPROPERTY, cstrName);
- AfxMessageBox(cstrError);
- }
- }
- else
- pProp->put_Value(0,pvar);
- }
- }
- else
- ASSERT(FALSE);
- CDialog::OnOK();
- }
-
- BOOL CPropDialog::DestroyWindow()
- {
- CListCtrl *pPropsList = (CListCtrl *)GetDlgItem(IDC_PROPERTYLIST);
- if (pPropsList != NULL)
- {
- ASSERT(::IsWindow(pPropsList->GetSafeHwnd()));
- Property *pProp = NULL;
- COleVariant *pvarVal;
- int iCount = pPropsList->GetItemCount();
- for (int iItem = 0; iItem < iCount; iItem++)
- {
- pProp = (Property *)pPropsList->GetItemData(iItem);
- if (pProp != NULL)
- pProp->Release();
- pvarVal = (COleVariant *)m_arrVal.GetAt(iItem);
- if (pvarVal != NULL)
- delete pvarVal;
- }
- }
- else
- ASSERT(FALSE);
-
- return CDialog::DestroyWindow();
- }
-
- void CPropDialog::OnAdd()
- {
- CAddProperty dlgAdd;
- if (dlgAdd.DoModal())
- {
- CListCtrl *pPropsList = (CListCtrl *)GetDlgItem(IDC_PROPERTYLIST);
-
- int iCount = pPropsList->GetItemCount();
- LV_ITEM lvitem;
- lvitem.mask = LVIF_TEXT;
- lvitem.iItem = iCount;
-
- lvitem.iSubItem = IND_SUBITEMINDEX;
- CString cstrText = "?";
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- int index = pPropsList->InsertItem(&lvitem);
- ASSERT(index >= 0);
-
- lvitem.iSubItem = IND_SUBITEMID;
- cstrText = "?";
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- lvitem.iSubItem = IND_SUBITEMNAME;
- cstrText = dlgAdd.m_cstrName;
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- lvitem.iSubItem = IND_SUBITEMREADONLY;
- lvitem.pszText = dlgAdd.m_bReadOnly ? "r-" : "rw";
- VERIFY(pPropsList->SetItem(&lvitem));
-
- lvitem.iSubItem = IND_SUBITEMTYPE;
- cstrText = dlgAdd.m_cstrType;
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
-
- COleVariant *pvarVal = new COleVariant();
- pvarVal->vt = TextToVartype(cstrText);
- lvitem.iSubItem = IND_SUBITEMVALUE;
- cstrText = VariantToText(pvarVal, IDS_SOURCE);
- lvitem.pszText = (LPTSTR)(LPCTSTR)cstrText;
- VERIFY(pPropsList->SetItem(&lvitem));
- VERIFY(index == m_arrVal.Add(pvarVal));
- }
- }
-